if ( !window.controller ) throw new Error( '"controller" not initialized' );
if ( !controller.DataProvider ) {
/**
* Контроллер проводник данных
* - Отсылка и прием Ajax запросов
* - Прием данных от commet сервера 
*/
	controller.DataProvider = function(){
		var $ = controller
		
		/**
		* Конструктор
		* - ID юзера в плексе
		* - Курсор последних данных
		*/
		var DataProvider = function(){
			DataProviderSuperPrototype.constructor.call( this );		
			this.rplConnect();
			var app = this;			
		}
		$.extend( DataProvider, $.events.EventDispatcher );

		var DataProviderPrototype 		= DataProvider.prototype,
			DataProviderSuperPrototype 	= DataProvider.superPrototype;
		//DataProviderPrototype.
		var dispatchEvent= DataProviderSuperPrototype.dispatchEvent;
		var EEvent = $.events.Event;	
		
		// Коннект к комет серверу
		DataProviderPrototype.rplConnect = function(){
			// Создаем соединение
			this._rplConnect = new Dklab_Realplexor(pServer, pPrefix);
			// Добавляем юзера
			this._rplConnect.subscribe(wj_user.get("plex_id"), function(){});
			var obg = this;
			// Добавляем глобальный канал game и назначаем на него коллбэк
			this._rplConnect.subscribe("game", function(response, id){
					obg.rplProvide(response, id);
				});
			this._rplConnect.setCursor("game", wj_user.get("plex_cursor"));
			//this._rplConnect.setCursor("game", 0);
			this._rplConnect.execute();
						
		}
	// Коллбак для Комет сервера
	/**
	* Задача комета передавать события инициализируемые сервером
	* или другим игроком
	*/
		DataProviderPrototype.rplProvide = function(response, id){
			//console.log(response);
			//this.addLog(log_id, "out", print_r(response), "COMET");
			switch(response.action){
			// Мульти дата - много команд в одном запросе
				case ("MULTI_DATA"):
					for(var i in response.data){
						//console.log("AJAX Action "+ response.data[i].action);
						var event = new EEvent( "REALPLEXOR" );
						event.action = response.data[i].a;
						event.data = response.data[i].d;
						dispatchEvent.call(this, event);
					}
				break;
				default:
					//console.log("AJAX Action "+ response.action);
					var event 		= new EEvent( "REALPLEXOR" );
					event.action 	= response.a;
					event.data 		= response.d;
					dispatchEvent.call(this, event);
			}
			var event 	 			= new EEvent( "AJAX_END_COMMAND" );
				dispatchEvent.call( this, event);
			
		}
		
	/**
	* Аякс - в основе jQuery.post
	* hash - тело запроса
	* noEvent - использовать ли событийную модель для получения данных
	*/
		DataProviderPrototype.Ajax = function(hash, onSucces, noEventSuccess){
			noEventSuccess = (noEventSuccess) ? true : noEventSuccess;
			//console.log("Ajax");
			hash = (!hash) ? {} : hash ;
			hash.ajax = 1;
			var app = this; 
			var succes;
			
			jQuery.post('/', hash, function(json){
					succes = json;
					app.ajaxHandler(json, noEventSuccess);
					if(onSucces) onSucces(succes);
				}, "text");
			return succes;
		}
		
		
		var log_id = 0;
		DataProviderPrototype.addLog = function(id, inout, data, type){
			switch(inout){
				case "out":
					var html = "<div class='log_' id='dpLog_"+id+"'><table width='100%'><tr><td rowspan='2' width='75'>"+type+"</td><td width='15'>OUT:</td><td><div class='out'>"+data+"</div></td></tr><tr><td width='15'>IN:</td><td><div class='in'></div></td></tr></table></div>";
					jQuery("#console").prepend(html);
				break;
				case "in":
					jQuery("#dpLog_"+id+" div.in").html(data);
				break;
			}
			
		}
		DataProviderPrototype.ajaxHandler = function(json, noEventSuccess){
			json = eval("(" + json + ")");
		// Рассортировываем команды	
			if(json.result){
				if(typeof json.result == ("object" || "array")){
					for(var a in json.result){
				// Событие
						if(typeof json.result[a] == ("object" || "array") && json.result[a].a && json.result[a].d){
							var event 	 = new EEvent( "AJAX" );
								event.action = json.result[a].a;
								event.data 	 = json.result[a].d;
								dispatchEvent.call( this, event);/**/
						}
					}
					var event 	 = new EEvent( "AJAX_END_COMMAND" );
					dispatchEvent.call( this, event);
				}
			// Сообщаем о том что все выполненно и можно перерисовывать экран
				//if(event.action != "user.auth" && event.data!='logout'){
					
				//}
				if(noEventSuccess){}
			}

		}
		
		
		


		return DataProvider;
	}();
}
